/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.ejb.EJBAdminSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.datamodel.SolicitudesDynamicDataModel;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dto.SolicitudDto;
import co.com.claro.administracionSolicitudes.entity.EstadosSolicitud;
import co.com.claro.administracionSolicitudes.entity.Solicitud;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import co.com.claro.administracionSolicitudes.entity.enums.EstadosSolicitudEnum;
import co.com.claro.administracionSolicitudes.entity.enums.GruposEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author usuario
 */
@ManagedBean
@ViewScoped
public class CambioEjecutorBean {

    @EJB
    private EJBAdminSolicitudesLocal localAdminSol;
    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;

    /**
     * Lista con las solicitudes a asignar
     */
    //private List<Solicitud> solicitudesAsignar;
    private SolicitudesDynamicDataModel solicitudesAsignar;
    /**
     * Lista de los usuarios que son ejecutores o administradores de una
     * gerencia
     */
    private List<SelectItem> ejecutoresGerenciaItems;
    /**
     * Variable que contiene la descipción de la solicitud
     */
    private String descripcionSolicitud;
    /**
     * Variable que contiene el id de la solicitud que va a asignar
     */
    private Solicitud solicitudAsignar;
    /**
     * Variable que contiene el ejecutor seleccionado por el usuario
     */
    private String ejecutorSeleccionado;
    /**
     * Variable que almacena el id de la solicitud ingresada por el usuario
     */
    private String idSolicitud;

    private int filas = 30;

    private static final String COL_DEFAULT_SORT = "idSolicitud";

    private String columnaSorteada;
    private boolean ascendiente;

    @PostConstruct
    public void inicializarValores() {

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = false;

        cargarControles();
        llenarEjecutores();
    }

    /**
     * Creates a new instance of CambioEjecutorBean
     */
    public CambioEjecutorBean() {
    }

    //**************************** MÉTODOS PROPIOS DEL BEAN ********************
    /**
     * Método que obtiene el id del objeto contenido dentro del data table y
     * retorna la solicitude de la lista según el rol del usuario
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private Solicitud obtenerObjeto(ActionEvent event, String idComponente) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent(idComponente);
        Long id = (Long) componente.getValueExpression("value").getValue(context.getELContext());

        return localDatabase.findSolicitudById(id);
    }

    /**
     * Método que permite cargar los valores de las solicitudes para asignar
     */
    private void cargarControles() {
        Usuario usuario = sesionBean.getUsuario();
        SolicitudDto dto = new SolicitudDto();

        List<EstadosSolicitudEnum> estados = new ArrayList<EstadosSolicitudEnum>();

        estados.add(EstadosSolicitudEnum.POR_EJECUTAR);

        if (!sesionBean.obtenerRolUsuario().getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())) {
            dto.setIdGerenciaAsignadora(usuario.getGerencia().getIdGerencia());
        }
        dto.setEstados(estados);
        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        solicitudesAsignar = new SolicitudesDynamicDataModel(localDatabase, dto);
    }

    /**
     * Método que obtiene los ejecutores que pertenecen a la gerencia y que
     * tienen el rol de Administradores y ejecutores y además están activos en
     * el sistema
     */
    private void llenarEjecutores() {
        List<Usuario> ejecutoresGerencia;
        StringBuilder nombreEjecutor = new StringBuilder();

        ejecutoresGerencia = localDatabase.findUsuarioByGerenciaAndGrupo(sesionBean.getUsuario().getGerencia().getIdGerencia(),
                GruposEnum.EJECUTOR.getId(), GruposEnum.ADMINISTRADOR.getId(), EstadoActividadEnum.ACTIVO.getId());

        if (ejecutoresGerenciaItems == null) {
            ejecutoresGerenciaItems = new ArrayList<SelectItem>();
        }
        for (Usuario usr : ejecutoresGerencia) {
            nombreEjecutor.append(usr.getNombres());
            nombreEjecutor.append(" ");
            nombreEjecutor.append(usr.getApellidos());

            ejecutoresGerenciaItems.add(new SelectItem(usr.getIdUsuario(), nombreEjecutor.toString()));
            nombreEjecutor.delete(0, nombreEjecutor.length());
        }
    }

    //************************** EVENTOS PROPIOS DEL EJB ************************
    /**
     * Método que envía la solicitud para su asignación
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para asignación
     */
    public void asignarSolicitud(ActionEvent event) {
        solicitudAsignar = obtenerObjeto(event, "idSolicitudOutputText");

        descripcionSolicitud = solicitudAsignar.getDescripcion();
        ejecutorSeleccionado = solicitudAsignar.getIdEjecutor().getIdUsuario().toString();
    }

    /**
     * Método que envía la solicitud para su asignación
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para asignación
     */
    public void buscarSolicitud(ActionEvent event) {
        SolicitudDto dto = new SolicitudDto();
        if (idSolicitud != null && !idSolicitud.isEmpty()) {
            dto.setIdSolicitud(Integer.parseInt(idSolicitud));
        }

        dto.setIdGerenciaAsignadora(sesionBean.getUsuario().getGerencia().getIdGerencia());

        solicitudesAsignar = new SolicitudesDynamicDataModel(localDatabase, dto);
    }

    /**
     * Método que asigna la solicitud a un ejecutor
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para asignación
     */
    public void asignarSolicitudEjecutor(ActionEvent event) {
        StringBuilder usuarioCompleto = new StringBuilder(sesionBean.getUsuario().getNombres());
        usuarioCompleto.append(" ");
        usuarioCompleto.append(sesionBean.getUsuario().getApellidos());

        solicitudAsignar.setIdEjecutor(new Usuario(Integer.parseInt(ejecutorSeleccionado)));
        solicitudAsignar.setUsuario(usuarioCompleto.toString());

        try {
            localAdminSol.asignarSolicitud(solicitudAsignar);
        } catch (ClaroException ex) {
            Logger.getLogger(InicioBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        cargarControles();
    }

    /**
     * Método que envía la solicitud para su cancelación
     *
     * @param event, el control que lanzó la acción y contiene los datos de la
     * solicitud que se envía para cancelación
     */
    public void cancelarSolicitud(ActionEvent event) {
        Solicitud solicitudAprobar = obtenerObjeto(event, "idSolicitudOutputText");
        solicitudAprobar.setUsuario(sesionBean.getUsuario().getUsername());
        solicitudAprobar.setEstado(new EstadosSolicitud(EstadosSolicitudEnum.CANCELADO.getId()));

        try {
            localAdminSol.cancelarSolicitud(solicitudAprobar);
        } catch (ClaroException ex) {
            Logger.getLogger(InicioBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        cargarControles();
    }

    public boolean paginado() {
        return solicitudesAsignar.getTotalCount() > filas;
    }

    public void ordenar() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteada.equals(property)) {
                ascendiente = !ascendiente;
            } else {
                columnaSorteada = property;
                ascendiente = true;
            }
        }

        cargarControles();
    }

    //+++++++++++++++++++++++ GETTERS Y SETTERS +++++++++++++++++++++++++++++++++++
    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public SolicitudesDynamicDataModel getSolicitudesAsignar() {
        return solicitudesAsignar;
    }

    public void setSolicitudesAsignar(SolicitudesDynamicDataModel solicitudesAsignar) {
        this.solicitudesAsignar = solicitudesAsignar;
    }

//    public List<Solicitud> getSolicitudesAsignar() {
//        return solicitudesAsignar;
//    }
//
//    public void setSolicitudesAsignar(List<Solicitud> solicitudesAsignar) {
//        this.solicitudesAsignar = solicitudesAsignar;
//    }
    public List<SelectItem> getEjecutoresGerenciaItems() {
        return ejecutoresGerenciaItems;
    }

    public void setEjecutoresGerenciaItems(List<SelectItem> ejecutoresGerenciaItems) {
        this.ejecutoresGerenciaItems = ejecutoresGerenciaItems;
    }

    public String getDescripcionSolicitud() {
        return descripcionSolicitud;
    }

    public void setDescripcionSolicitud(String descripcionSolicitud) {
        this.descripcionSolicitud = descripcionSolicitud;
    }

    public String getEjecutorSeleccionado() {
        return ejecutorSeleccionado;
    }

    public void setEjecutorSeleccionado(String ejecutorSeleccionado) {
        this.ejecutorSeleccionado = ejecutorSeleccionado;
    }

    public String getIdSolicitud() {
        return idSolicitud;
    }

    public void setIdSolicitud(String idSolicitud) {
        this.idSolicitud = idSolicitud;
    }

    public int getFilas() {
        return filas;
    }

    public boolean isAscendiente() {
        return ascendiente;
    }

}
